$Description$
有$n$个厨师$m$道菜,每种菜有$p_i$个人点,每个厨师$j$烧第$i$道菜要$t_{i,j}$分钟,所有人等菜时间之和为多少?
$Solution$
我们就按照那题的方法建图
对于每个菜$i$
$S \stackrel{p_{i}, 0}{\longrightarrow}i$
然后建$n$层点,每层点有$m$个点,第$i$层的第$j$个点表示第$j$个厨师做第倒数$i$道菜,记为$c_{i,j}$。
$c_{i,j} \stackrel{1, 0}{\longrightarrow}t$
假设第$j$个厨师做第倒数$k$道菜,那么对于菜$i$,向其连一条流量为$1$,费用为$k\times t_{i,j}$的边。这表示第$j$个厨师做的倒数第$k$道菜是菜$i$,那么就要做$t_{i,j}$这么长的时间,有$k$个人要等这么长的时间。
$i \stackrel{1,k\times t_{i,j}}{\longrightarrow}c_{j,k}$
然后,我们会发现,这样写会$T$成傻$*$
然后我们就必须进行优化
我们发现一个性质,如果经过$c_{i,j}$的流为$0$,那么经过$c_{i+1,j}\sim c_{n,j}$的流也一定为$0$.也就是说这些点根本不用建。
于是我们先建$n$个菜和第一层点,并连接第一层点和$t$,跑一边$spfa$
一旦一条增广路被用掉了(也就是$c_{j,k}$被用掉了),那么我们就把$c_{j,k+1}$加上去,再跑$spfa$
所以我们考虑用$EK$写费用流,因为$EK$一次只找一条增广路,与题意相符,且跑费用流的效率和$Dinic$差不多快(我也不知道为什么)。
$Code$
1 |
|